/*
 * 页面列表钩子函数
 * @Date: 2024-02-26 11:11:07
 * @LastEditTime: 2024-06-14 17:41:31
 * @Description: 提供下拉刷新和上拉加载功能的页面列表管理
 * @param {Object} config 配置对象，包含初始化参数
 * @returns 返回包含页面列表相关功能的对象
 */
import {
  deepClone,
  isEmpty,
} from '@/util/common';

import {
  useTips
} from '@/hooks/useTips'

/**
 * 使用页面列表的自定义hook。
 * @param {Object} config 配置对象，提供初始化参数。
 * @param {Object} config.downConfig 下拉刷新的配置。
 * @param {Object} config.upConfig 上拉加载的配置。
 * @param {Array} config.list 初始列表数据。
 * @param {Object} config.pageListRef 页面列表的引用。
 * @param {Object} config.queryParam 查询参数。
 * @param {Function} config.api 数据请求的API函数。
 * @returns {Object} 返回包含页面列表相关功能的对象。
 */
export const usePageList = ({
  downConfig = {},
  upConfig = {},
  list = ref([]),
  pageListRef = ref(),
  queryParam = ref({}),
  api = () => { },
}) => {
  const {
    showLoading,
    showToast,
    showLoaded,
  } = useTips()

  // 初始化下拉和上拉的配置项
  const downOption = ref(isEmpty(downConfig.downOption) ? {} : downConfig.downOption)
  const upOption = ref(isEmpty(upConfig.upOption) ? {} : upConfig.upOption)

  /**
   * 下拉刷新回调函数
   * 用于重置列表数据和滚动位置
   */
  const downPullCallback = async () => {
    if (downConfig.isDownPullCallback === true) {
      return await downConfig.downPullCallback()
    }
    list.value = []
    resetUpScroll()
  }
  const resetUpScroll = () => {
    nextTick(() => {
      pageListRef.value.meScrollListManager.resetUpScroll()
    })
  }

  /**
   * 上拉加载回调函数
   * @param {Object} param0 包含页码和每页大小的对象
   * @param {number} param0.pageNo 当前页码
   * @param {number} param0.pageSize 每页大小
   * @returns {Promise<void>} 异步操作，无返回值
   */
  const upCallback = async ({
    pageNo,
    pageSize
  }) => {
    if (upConfig.isUpCallback === true) {
      return await upConfig.upCallback({
        pageNo,
        pageSize,
      })
    }
    let params = deepClone(queryParam.value) || {}
    Object.assign(params, {
      pageNo,
      pageSize,
    })
    let res = {};
    // showLoading()
    try {
      res = await api(params)
    } catch (err) {
      console.log('upCallback err', err)
      upCallbackError()
      return
    }
    console.log('upCallback res', res)
    if (!res?.success) {
      showToast(res?.message || '请求失败')
      upCallbackError()
      return
    }
    const result = res.result
    const newList = result.records
    const hasNextPage = result.pages > pageNo
    if (pageNo === 1) {
      list.value = newList
    } else {
      list.value = list.value.concat(newList)
    }
    upCallbackSuccess(newList.length, hasNextPage)
  }
  /**
   * 上拉加载失败回调函数
   * 用于更新界面显示加载失败的状态
   */
  const upCallbackError = () => {
    nextTick(() => {
      pageListRef.value.meScrollListManager.upCallbackError()
    })
  }
  /**
   * 上拉加载成功回调
   * @param {number} [num=0] 加载的数据量
   * @param {boolean|null} [hasNextPage=null] 是否有下一页数据
   * @param {number} [time=300] 动画延迟时间
   * @returns {Promise<void>} 异步操作，无返回值
   */
  const upCallbackSuccess = (num = 0, hasNextPage = null, time = 300) => {
    nextTick(() => {
      pageListRef.value.meScrollListManager.upCallbackSuccess(num, hasNextPage, time)
    })
  }

  return {
    pageListRef,
    list,
    queryParam,
    downOption,
    upOption,
    downPullCallback,
    upCallback,
    upCallbackError,
    upCallbackSuccess,
    resetUpScroll,
  }

}
